/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.montadora.abc.controller;

import br.com.montadora.abc.dao.PedidoDAO;
import br.com.montadora.abc.dao.PessoaDAO;
import br.com.montadora.abc.model.Funcionario;
import br.com.montadora.abc.model.Pedido;
import br.com.montadora.abc.model.Pessoa;
import br.com.montadora.abc.model.Veiculo;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author Aurelio
 */
@ManagedBean(name = "pedidoCtrl")
@SessionScoped
public class PedidoController {

    private PedidoDAO pedidoDAO;
    private PessoaDAO clienteDAO;
    private Integer idClienteEscolhido;
    private Integer idFuncionarioEscolhido;
    private List<Veiculo> listaVeiculos;
    private Pedido pedidoParaAlteracao;
    
    public PedidoController() {
        listaVeiculos = new ArrayList<Veiculo>();
        pedidoDAO = PedidoDAO.getInstance();
        clienteDAO = PessoaDAO.getInstance();
        pedidoParaAlteracao = new Pedido();
    }

    public List<SelectItem> carregarFuncionarios() {
        List<Funcionario> funcionarios = pedidoDAO.carregarTudoOrdenado(Funcionario.class, "nome");
        List<SelectItem> retorno = new ArrayList(funcionarios.size());
        for (Funcionario funcionario : funcionarios) {
            retorno.add(new SelectItem(funcionario.getId(), funcionario.getNome()));
        }
        return retorno;
    }

    public List<SelectItem> carregarClientes() {
        List<Pessoa> listaPessoas = new ArrayList<Pessoa>();
        try {
            listaPessoas = clienteDAO.listarClientes();
            List<SelectItem> retorno = new ArrayList(listaPessoas.size());

            for (Pessoa cliente : listaPessoas) {
                retorno.add(new SelectItem(cliente.getId(), cliente.getNome()));
            }
            return retorno;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void salvar() {
        Boolean habilitaSalvar = Boolean.FALSE;
        Pedido pedido = new Pedido();
        List<Veiculo> veiculosEscolhidos = new ArrayList<Veiculo>();
        try {
            pedido.setDataPedido(new Date());
            Pessoa cliente = (Pessoa) pedidoDAO.carregarUm(idClienteEscolhido, Pessoa.class);
            pedido.setCliente(cliente);
            
            for (Veiculo veiculo : this.listaVeiculos) {
                if (veiculo.getEscolhido()) {
                    veiculosEscolhidos.add(veiculo);
                    habilitaSalvar = Boolean.TRUE;
                }
            }
            if (habilitaSalvar) {
                pedido.setVeiculos(veiculosEscolhidos);
                pedidoDAO.gravar(pedido);
                Funcionario funcionario = (Funcionario) pedidoDAO.carregarUm(idFuncionarioEscolhido, Funcionario.class);
                pedido.setFuncionario(funcionario);
                pedidoDAO.merge(pedido);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Pedido Salvo com sucesso!", null));
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Selecione ao menos um veiculo para completar o pedido!", null));
            }

        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Ocorreu um Erro ao salvar o pedido!", null));
            e.printStackTrace();
        }
    }
    
    public List<Pedido> listarPedido(){
       try{
           List<Pedido> pedidos = pedidoDAO.listarPedidosComVeiculos();
           return pedidos;
       } catch(Exception e){
           e.printStackTrace();
           return null;
       }
    }

      public void excluirPedido(Pedido pedido){
        try{
            pedidoDAO.excluir(pedido);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Pedido excluído com sucesso!", null));

        }catch(Exception e){
            e.printStackTrace();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Ocorreu um Erro ao tentar excluir o pedido!", null));

        }
    }
    /**
     * @return the idClienteEscolhido
     */
    public Integer getIdClienteEscolhido() {
        return idClienteEscolhido;
    }

    /**
     * @param idClienteEscolhido the idClienteEscolhido to set
     */
    public void setIdClienteEscolhido(Integer idClienteEscolhido) {
        this.idClienteEscolhido = idClienteEscolhido;
    }

    /**
     * @return the idFuncionarioEscolhido
     */
    public Integer getIdFuncionarioEscolhido() {
        return idFuncionarioEscolhido;
    }

    /**
     * @param idFuncionarioEscolhido the idFuncionarioEscolhido to set
     */
    public void setIdFuncionarioEscolhido(Integer idFuncionarioEscolhido) {
        this.idFuncionarioEscolhido = idFuncionarioEscolhido;
    }

    /**
     * @return the listaVeiculos
     */
    public List<Veiculo> getListaVeiculos() {
        try {
            this.listaVeiculos = (List<Veiculo>) pedidoDAO.carregarTudoOrdenado(Veiculo.class, "nome");
            return this.listaVeiculos;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * @param listaVeiculos the listaVeiculos to set
     */
    public void setListaVeiculos(List<Veiculo> listaVeiculos) {
        this.listaVeiculos = listaVeiculos;
    }

    /**
     * @return the pedidoParaAlteracao
     */
    public Pedido getPedidoParaAlteracao() {
        return pedidoParaAlteracao;
    }

    /**
     * @param pedidoParaAlteracao the pedidoParaAlteracao to set
     */
    public void setPedidoParaAlteracao(Pedido pedidoParaAlteracao) {
        this.pedidoParaAlteracao = pedidoParaAlteracao;
    }
}
